Deduplicaci贸n de Recursos en React Suspense: Previniendo Solicitudes Duplicadas | MLOG | MLOG

Ahora, el UserResource comprueba si ya existe un recurso en el cache. Si existe, se devuelve el recurso en cach茅. De lo contrario, se inicia una nueva solicitud y la promesa resultante se almacena en la cach茅. Esto asegura que solo se realice una solicitud por cada userId 煤nico.

2. Usando una Biblioteca de Cach茅 Dedicada (p. ej., lru-cache)

Para escenarios de almacenamiento en cach茅 m谩s complejos, considere usar una biblioteca de cach茅 dedicada como lru-cache o similar. Estas bibliotecas proporcionan caracter铆sticas como la expulsi贸n de la cach茅 basada en el Menos Recientemente Usado (LRU) u otras pol铆ticas, lo que puede ser crucial para gestionar el uso de la memoria, especialmente cuando se trata de una gran cantidad de recursos.

Primero, instale la biblioteca:

            
npm install lru-cache

            

Luego, int茅grala en tu UserResource:

            
import React, { Suspense } from 'react';
import LRUCache from 'lru-cache';

const fetchUser = (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simula una solicitud de red
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({ id: userId, name: `User ${userId}`, email: `user${userId}@example.com` });
    }, 1000); // Simula la latencia de la red
  });
};

const cache = new LRUCache({
  max: 100, // N煤mero m谩ximo de elementos en la cach茅
  ttl: 60000, // Tiempo de vida en milisegundos (1 minuto)
});

const UserResource = (userId) => {
  if (!cache.has(userId)) {
    let promise = null;
    let status = 'pending'; // pendiente, 茅xito, error
    let result;

    const suspender = fetchUser(userId).then(
      (r) => {
        status = 'success';
        result = r;
        cache.set(userId, {
          read() {
            return result;
          },
        });
      },
      (e) => {
        status = 'error';
        result = e;
        cache.set(userId, {
          read() {
            throw result;
          },
        });
      }
    );

    cache.set(userId, {
        read() {
            if (status === 'pending') {
                throw suspender;
            } else if (status === 'error') {
                throw result;
            }
            return result;
        }
    });
  }

  return cache.get(userId);
};


const UserProfile = ({ userId }) => {
  const user = UserResource(userId).read();
  return (
    

User Profile

ID: {user.id}

Name: {user.name}

Email: {user.email}

); }; const UserDetails = ({ userId }) => { const user = UserResource(userId).read(); return (

User Details

ID: {user.id}

Name: {user.name}

); }; const App = () => { return ( Loading...
}> ); }; export default App;

Este enfoque proporciona m谩s control sobre el tama帽o y la pol铆tica de expiraci贸n de la cach茅.

3. Coalescencia de Solicitudes con Bibliotecas como axios-extensions

Bibliotecas como axios-extensions ofrecen caracter铆sticas m谩s avanzadas como la coalescencia de solicitudes. La coalescencia de solicitudes combina m煤ltiples solicitudes id茅nticas en una sola, optimizando a煤n m谩s el uso de la red. Esto es particularmente 煤til en escenarios donde las solicitudes se inician muy cerca unas de otras en el tiempo.

Primero, instale la biblioteca:

            
npm install axios axios-extensions

            

Luego, configure Axios con el adaptador de cache proporcionado por axios-extensions.

Ejemplo usando axios-extensions y creando un recurso:

            
import React, { Suspense } from 'react';
import axios from 'axios';
import { cacheAdapterEnhancer, throttleAdapterEnhancer } from 'axios-extensions';

const instance = axios.create({
  baseURL: 'https://api.example.com', // Reemplace con su endpoint de la API
  adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: true }),
});

const fetchUser = async (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simula una solicitud de red
  const response = await instance.get(`/users/${userId}`);
  return response.data;
};


const UserResource = (userId) => {
    let promise = null;
    let status = 'pending'; // pendiente, 茅xito, error
    let result;

    const suspender = fetchUser(userId).then(
        (r) => {
            status = 'success';
            result = r;
        },
        (e) => {
            status = 'error';
            result = e;
        }
    );

    return {
        read() {
            if (status === 'pending') {
                throw suspender;
            } else if (status === 'error') {
                throw result;
            }
            return result;
        },
    };
};


const UserProfile = ({ userId }) => {
  const user = UserResource(userId).read();
  return (
    

User Profile

ID: {user.id}

Name: {user.name}

Email: {user.email}

); }; const UserDetails = ({ userId }) => { const user = UserResource(userId).read(); return (

User Details

ID: {user.id}

Name: {user.name}

); }; const App = () => { return ( Loading...
}> ); }; export default App;

Esto configura Axios para usar un adaptador de cach茅, almacenando autom谩ticamente las respuestas seg煤n la configuraci贸n de la solicitud. La funci贸n cacheAdapterEnhancer proporciona opciones para configurar la cach茅, como establecer un tama帽o m谩ximo de cach茅 o un tiempo de expiraci贸n. throttleAdapterEnhancer tambi茅n se puede usar para limitar el n煤mero de solicitudes realizadas al servidor en un cierto per铆odo de tiempo, optimizando a煤n m谩s el rendimiento.

Mejores Pr谩cticas para la Deduplicaci贸n de Recursos

Consideraciones Globales para la Obtenci贸n de Datos y la Deduplicaci贸n

Al dise帽ar estrategias de obtenci贸n de datos para una audiencia global, entran en juego varios factores:

Por ejemplo, un sitio web de reservas de viajes dirigido a una audiencia global podr铆a usar una CDN para servir datos de disponibilidad de vuelos y hoteles desde servidores ubicados en diferentes regiones. El sitio web tambi茅n usar铆a una API de conversi贸n de moneda para mostrar los precios en la moneda local del usuario y proporcionar opciones para filtrar los resultados de b煤squeda seg煤n las preferencias de idioma.

Conclusi贸n

La deduplicaci贸n de recursos es una t茅cnica de optimizaci贸n esencial para las aplicaciones de React que utilizan Suspense. Al prevenir solicitudes duplicadas de obtenci贸n de datos, puede mejorar significativamente el rendimiento, reducir la carga del servidor y mejorar la experiencia del usuario. Ya sea que elija implementar una cach茅 de promesas simple o aprovechar bibliotecas m谩s avanzadas como lru-cache o axios-extensions, la clave es comprender los principios subyacentes y elegir la soluci贸n que mejor se adapte a sus necesidades espec铆ficas. Recuerde considerar factores globales como las CDNs, la localizaci贸n y la accesibilidad al dise帽ar sus estrategias de obtenci贸n de datos para una audiencia diversa. Al implementar estas mejores pr谩cticas, puede construir aplicaciones de React m谩s r谩pidas, eficientes y amigables para el usuario.